﻿# -*-coding:utf-8 -*-
import os, sys, time, struct, random
import HTCMsg, qutils, chcode, qwater
K_SRV_IP        = '192.168.1.218'
K_SRV_PORT      = 6900

K_RCT_MSG_ERROR        = -1
K_RCT_MSG_OK           = 0
K_RCT_MSG_START        = 1
K_RCT_MSG_STOP         = 2

def dbSelectGetPhone(aCard):
    qutils.rctLogger.info("--------- dbSelectGetPhone ---------")
    tmpCard = str(aCard)
    qutils.rctLogger.info("card=%s" % (tmpCard))    
    if qutils.isEmpty(tmpCard):
        qutils.rctLogger.error("dbSelectGetPhone error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_PHONE(" + tmpCard +")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)

    tmpInfo = qutils.splitRsp(tmpRet)

    qutils.rctLogger.info("phone=%s" % (tmpInfo))

    if tmpInfo == '-1':
        qutils.rctLogger.error("dbSelectGetPhone error : server")
        return HTCMsg.msgError(-1, qutils.K_ERR_SRV)  
    if tmpInfo == '-2':
        qutils.rctLogger.error("dbSelectGetPhone error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)
    if tmpInfo == '-3':
        qutils.rctLogger.error("dbSelectGetPhone error : disable")
        return HTCMsg.msgError(-3, qutils.K_ERR_USER_DISABLE)
    if tmpInfo == '-4':
        qutils.rctLogger.error("dbSelectGetPhone error : unexist")
        return HTCMsg.msgError(-4, qutils.K_ERR_USER_UNEXIST)
    if tmpInfo == '-5':
        qutils.rctLogger.error("dbSelectGetPhone error : lost")
        return HTCMsg.msgError(-5, qutils.K_ERR_USER_LOST)

    if not chcode.shouldSendNew(tmpCard,int(time.time())):
        return HTCMsg.msgOk()

    tmpCode = str(random.randint(1000,9999))
    tmpRsp = chcode.httpSMS(tmpInfo,tmpCode)

    if tmpRsp is None:
        qutils.rctLogger.error("dbSelectGetPhone error : cadefail")
        return HTCMsg.msgError(-6, qutils.K_ERR_CODE_FAIL)

    chcode.writeToConfig(tmpCard, tmpCode)
    return HTCMsg.msgOk()

def dbSelectGetCardInfos(aCard) :
    qutils.rctLogger.info("--------- dbSelectGetCardInfos ---------")
    tmpCard = str(aCard)
    qutils.rctLogger.info("card=%s" % (tmpCard))    
    if qutils.isEmpty(tmpCard):
        qutils.rctLogger.error("dbSelectGetCardInfos error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_CARDINFOS(" + tmpCard +")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    tmpInfo = qutils.splitRsp(tmpRet)
    if tmpInfo == '-1':
        qutils.rctLogger.error("dbSelectGetPhone error : server")
        return HTCMsg.msgError(-1, qutils.K_ERR_SRV)  

    return HTCMsg.msgCardInfos(tmpInfo)

def dbSelectGetUsingList(aCard) :
    qutils.rctLogger.info("--------- dbSelectGetUsingList ---------")
    tmpCard = str(aCard)
    qutils.rctLogger.info("card=%s" % (tmpCard))    
    if qutils.isEmpty(tmpCard):
        qutils.rctLogger.error("dbSelectGetUsingList error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_USINGLIST(" + tmpCard +")</body></cmd></msg>"
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    tmpInfo = qutils.splitRsp(tmpRet)
    qutils.rctLogger.info("dbSelectGetUsingList=%s" % (tmpInfo))

    if tmpInfo == '-1':
        qutils.rctLogger.error("dbSelectGetUsingList error : server")
        return HTCMsg.msgError(-1, qutils.K_ERR_SRV)

    if tmpInfo == '0':
        return HTCMsg.msgOk()

    return HTCMsg.msgUsingList(tmpInfo)

def dbSelectGetLocList(aLon, aLat) :
    qutils.rctLogger.info("--------- dbSelectGetLocList ---------")
    tmpLon  = str(aLon)
    tmpLat  = str(aLat)
    qutils.rctLogger.info("lon=%s,lat=%s" % (aLon, aLat))
    if qutils.isEmpty(tmpLon) or qutils.isEmpty(tmpLat):
        qutils.rctLogger.error("dbSelectGetLocList error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)
    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_LONLATDEV(" + tmpLon + "," + tmpLat +")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet  = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    tmpInfo = qutils.splitRsp(tmpRet)
    qutils.rctLogger.info("dbSelectGetLocList=%s" % (tmpInfo))

    if tmpInfo == '-1':
        qutils.rctLogger.error("dbSelectGetLocList error : server")
        return HTCMsg.msgError(-1, qutils.K_ERR_SRV)

    if tmpInfo == '0':
        return HTCMsg.msgOk()
    return HTCMsg.msgLocList(tmpInfo)

def dbSelectGetOneDevice(aCard, aDid) :
    qutils.rctLogger.info("--------- dbSelectGetOneDevice ---------")
    tmpCard = str(aCard)
    tmpDid  = str(aDid)
    qutils.rctLogger.info("card=%s,did=%s" % (tmpCard, tmpDid))
    if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpDid):
        qutils.rctLogger.error("dbSelectGetOneDevice error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_ONEDEVICE(" + tmpCard + ",'" + tmpDid + "')</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet  = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd) 
    tmpInfo = qutils.splitRsp(tmpRet)
    if tmpInfo == '-1':
        return HTCMsg.msgError(-1, qutils.K_ERR_SRV)

    return HTCMsg.msgOneDev(tmpInfo)

def dbSelectGetUserStatus(aCard) :
    qutils.rctLogger.info("--------- dbSelectGetUserStatus ---------")
    tmpCard = str(aCard)
    qutils.rctLogger.info("card=%s" % (tmpCard))
    if qutils.isEmpty(tmpCard):
        qutils.rctLogger.error("dbSelectGetUserStatus error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_USERSTATUS(" + tmpCard + ")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet  = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd) 
    tmpInfo = qutils.splitRsp(tmpRet)
    if tmpInfo != '0':
        return K_RCT_MSG_ERROR

    return K_RCT_MSG_OK

#获取账单列表
def dbSelectGetOrderList(aCard,aIdx) :
    qutils.rctLogger.info("--------- dbSelectGetOrderList ---------")
    tmpCard     = str(aCard)
    tmpCount    = str(aIdx)
    qutils.rctLogger.info("card=%s,count=%s" % (tmpCard,tmpCount))
    if qutils.isEmpty(tmpCard) or qutils.isEmpty(tmpCount):
        qutils.rctLogger.error("dbSelectGetOrderList error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_ORDERLIST(" + tmpCard + "," + tmpCount + ")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet  = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd) 
    tmpInfo = qutils.splitRsp(tmpRet)
    if tmpInfo == '0':
        return HTCMsg.msgOk()
    return HTCMsg.msgOrderList(tmpInfo)

#账单详情
def dbSelectGetOrderDetail(aSaleno) :
    qutils.rctLogger.info("--------- dbSelectGetOrderDetail ---------")
    tmpOrderNum     = str(aSaleno)
    qutils.rctLogger.info("ordernum=%s" % (tmpOrderNum))
    if qutils.isEmpty(tmpOrderNum):
        qutils.rctLogger.error("dbSelectGetOrderDetail error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_GET_ORDERMSG('" + aSaleno + "')</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet  = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd) 
    tmpInfo = qutils.splitRsp(tmpRet)

    if tmpInfo == '-1':
        return HTCMsg.msgError(-1, qutils.K_ERR_SRV)
    return HTCMsg.msgOrderDetail(tmpInfo)

#打印信息
def dbSelectSetOrderPrint(aOrderNum) :
    qutils.rctLogger.info("--------- dbSelectSetOrderPrint ---------")
    tmpOrderNum = str(aOrderNum)
    qutils.rctLogger.info("ordenum=%s" % (tmpOrderNum))
    if qutils.isEmpty(tmpOrderNum):
        qutils.rctLogger.error("dbSelectSetOrderPrint error : params")
        return HTCMsg.msgError(-2, qutils.K_ERR_PARAMS)

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_SET_ORDERPRINT('" + tmpOrderNum + "')</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)

    tmpRet  = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd) 
    tmpInfo = qutils.splitRsp(tmpRet)

    if tmpInfo == '-1':
        return HTCMsg.msgError(-1, qutils.K_ERR_SRV)

    if tmpInfo == '-2':
        return HTCMsg.msgError(-2, qutils.K_ERR_PRINT_LIMIT)

    return HTCMsg.msgOk()


'''********************************************************************
功能：
    1、通过副卡卡号匹配主卡
    2、支持身份证、M1卡，并且可以交叉使用
    3、在停止设备时使用
参数:
    aCardUsing(string)  : 当前正在使用的卡号
    aCardNow(string)    : 本次刷卡的号码
返回：
    K_RCT_MSG_OK        : 是主卡
    K_RCT_MSG_ERROR     : 不匹配
********************************************************************'''
def dbSelectBelongMCard(aCardUsing, aCardNow):
    qutils.rctLogger.info("--------- dbSelectBelongMCard ---------")
    tmpVMsn   = str(aCardUsing)
    tmpMMsn   = str(aCardNow)
    qutils.rctLogger.info("using=%s,cardnow=%s" % (tmpVMsn, tmpMMsn))
    if qutils.isEmpty(aCardUsing) or qutils.isEmpty(aCardNow):
        qutils.rctLogger.error("dbSelectBelongMCard error : params")
        return K_RCT_MSG_ERROR

    #请求数据库数据
    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_CARD_BELONG('" + tmpVMsn + "','" + tmpMMsn + "')</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    qutils.rctLogger.info(tmpRet)
    if not tmpRet or tmpRet != "<{true}[|0|]>" :
        qutils.rctLogger.error("dbSelectBelongMCard error : return")
        return K_RCT_MSG_ERROR
    qutils.rctLogger.info("dbSelectBelongMCard end")
    return K_RCT_MSG_OK

'''********************************************************************
功能：
    1、更新正在使用表的数据（设备会在表数据变化时更新）
    2、一般情况下精确到两位小位。小于两位小数不再更新
    3、正在使用并且表数发生变化时使用
参数:
    aCardUsing(string)  : 当前正在使用的卡号
    aDevId              : 设备ID
    aValue              : 需要更新的表数
返回：
    K_RCT_MSG_OK        : 更新成功
    K_RCT_MSG_ERROR     : 更新失败
********************************************************************'''
def dbSelectDevUpdate(aCardUsing, aDevId, aValue) :
    qutils.rctLogger.info("--------- dbSelectDevUpdate ---------")
    tmpVal  = str(aValue)
    tmpMsn  = str(aCardUsing)
    tmpDev  = str(aDevId)
    qutils.rctLogger.info("using=%s,dev=%s,val=%s" % (tmpMsn, tmpDev, tmpVal))
    if qutils.isEmpty(tmpVal) or qutils.isEmpty(tmpMsn) or qutils.isEmpty(tmpDev):
        qutils.rctLogger.error("error : params of value")
        return K_RCT_MSG_ERROR

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_CARD_UPDATE('" + tmpMsn + "','" + tmpDev + "'," + str("%.2f" % float(tmpVal)) + ")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    qutils.rctLogger.info(tmpRet)

    if not tmpRet or qutils.isEmpty(tmpRet) or tmpRet != "<{true}[|1&v;0|]>" :
        qutils.rctLogger.error("error : return")
        return K_RCT_MSG_ERROR

    qutils.rctLogger.info("dbSelectDevUpdate end")
    return K_RCT_MSG_OK

'''********************************************************************
功能：
    1、获取设备信息
    2、在收到设备进入时调用
参数:
    aDevId              : 设备ID
返回：
   K_RCT_MSG_ERROR      : 不匹配
   val元组              : [0]开始延迟时间, [1]结束延迟时间 
CMD返回的格式内容：
    1）<{true}[|1002&v;MzIy6KGo&v;5730303148FF6B067266545327200667&v;1.00000&v;60.00000&v;0&v;6&v;5&v;2.00&v;40.2076475481&v;116.6001201198|]>
    2）<{true}[|-4|]>
    arr[0]  : 设备四位id
    arr[1]  : 设备名称
    arr[2]  : mac地址，暂时存放设备编号
    arr[3]  : 每秒单价
    arr[4]  : 每吨单价
    arr[5]  : 支付类型 0计时1计量2智能
    arr[6]  : 开始延时（秒）
    arr[7]  : 结束延时（秒）
    arr[8]  : 最低消费（元）
    arr[9]  : 经度
    arr[10] : 维度
********************************************************************'''
def dbSelectDevInfo(aDevId) :
    qutils.rctLogger.info("--------- dbSelectDevInfo ---------")
    tmpDev  = str(aDevId)
    qutils.rctLogger.info("dev=%s" % (tmpDev))    
    if qutils.isEmpty(tmpDev) :
        qutils.rctLogger.error("error : params of value")
        return K_RCT_MSG_ERROR
    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_CARD_GET_DEVINFO('" + tmpDev + "')</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    qutils.rctLogger.info(tmpRet)    

    if not tmpRet or qutils.isEmpty(tmpRet) or len(tmpRet) < 13 or tmpRet[0:9] != "<{true}[|":
        qutils.rctLogger.error("error : return - 1")
        return K_RCT_MSG_ERROR

    #<{true}[|1002&v;MzIy6KGo&v;5730303148FF6B067266545327200667&v;1.00000&v;60.00000&v;0&v;6&v;5&v;2.00&v;40.2076475481&v;116.6001201198|]>
    tmpRet2 = tmpRet.replace('<{true}[|','').replace("|]>","")
    qutils.rctLogger.info(tmpRet2)
    if qutils.isEmpty(tmpRet2) :
        qutils.rctLogger.error("error : return - 2")
        return K_RCT_MSG_ERROR

    tmpRet3 = tmpRet2.split("&v;")
    qutils.rctLogger.info(tmpRet3)
    if not tmpRet3 or len(tmpRet3) < 11 :
        qutils.rctLogger.error("error : return - 3")
        return K_RCT_MSG_ERROR

    return tmpRet3[6],tmpRet3[7]

'''********************************************************************
功能：
    1、用户关闭水阀时，向服务器提交停止请求
    2、表数一般情况下精确到两位小位。小于两位小数不再更新
    3、在用户刷卡时调用
参数:
    aCardUsing(string)  : 当前正在使用的卡号
    aDevId              : 设备ID
    aValue              : 需要更新的表数
返回：
    K_RCT_MSG_OK        : 成功
    K_RCT_MSG_ERROR     : 失败
CMD返回格式内容：<{true}[|-4|]>
    0   : 表示成功
    -1  : 传入参数为空
    -2  : 不存在此设备
    -3  : 数据库没有此卡
    -4  : 不存在未完成订单
********************************************************************'''
def dbSelectStop(aCardUsing, aDevId, aValue) :
    qutils.rctLogger.info("--------- dbSelectStop ---------")
    tmpVal  = str(aValue)
    tmpMsn  = str(aCardUsing)
    tmpDev  = str(aDevId)
    tmpWay  = '0'
    qutils.rctLogger.info("using=%s,dev=%s,val=%s" % (tmpMsn, tmpDev, tmpVal))
    if qutils.isEmpty(tmpVal) or qutils.isEmpty(tmpMsn) or qutils.isEmpty(tmpDev) :
        qutils.rctLogger.error("error : params of value")
        return K_RCT_MSG_ERROR

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_CARD_STOP_WATER('" + tmpMsn + "','" + tmpDev + "'," + str("%.2f" % float(tmpVal)) + "," + tmpWay + ")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    qutils.rctLogger.info(tmpRet)

    if not tmpRet or qutils.isEmpty(tmpRet) or tmpRet != "<{true}[|0|]>" :
        qutils.rctLogger.error("error : return")
        return K_RCT_MSG_ERROR

    qutils.rctLogger.info("dbSelectStop end")
    return K_RCT_MSG_OK

'''********************************************************************
功能：
    1、用户打开水阀时，向服务器提交打开请求
    2、表数一般情况下精确到两位小位。小于两位小数不再更新
    3、在用户刷卡时调用
参数:
    aCardUsing(string)  : 当前正在使用的卡号
    aDevId              : 设备ID
    aValue              : 需要更新的表数
返回：
    K_RCT_MSG_OK        : 成功
    K_RCT_MSG_ERROR     : 失败
CMD返回格式内容：<{true}[|-4|]>
    0   : 表示成功
    -1  : 传入参数为空
    -2  : 不存在此设备
    -3  : 数据库没有此卡
    -4  : 不存在未完成订单
********************************************************************'''
def dbSelectStart(aCardUsing, aDevId, aValue) :
    qutils.rctLogger.info("--------- dbSelectstart ---------")
    tmpVal  = str(aValue)
    tmpMsn  = str(aCardUsing)
    tmpDev  = str(aDevId)
    tmpWay  = '0'
    qutils.rctLogger.info("using=%s,dev=%s,val=%s" % (tmpMsn, tmpDev, tmpVal))
    if qutils.isEmpty(tmpVal) or qutils.isEmpty(tmpMsn) or qutils.isEmpty(tmpDev) :
        qutils.rctLogger.error("error : params of value")
        return K_RCT_MSG_ERROR

    tmpCmd = "<msg><cmd class='select' conname='' clientid='' istran=''><body>select F_YLW_YLW_MY_CARD_START_WATER('" + tmpMsn + "','" + tmpDev + "'," + str("%.2f" % float(tmpVal)) + ")</body></cmd></msg>"
    qutils.rctLogger.info(tmpCmd)
    tmpRet = qutils.cmdSend(K_SRV_IP, K_SRV_PORT, tmpCmd)
    qutils.rctLogger.info(tmpRet)

    if not tmpRet or qutils.isEmpty(tmpRet) or tmpRet != "<{true}[|0|]>" :
        qutils.rctLogger.error("error : return")
        return K_RCT_MSG_ERROR

    qutils.rctLogger.info("dbSelectstart end")
    return K_RCT_MSG_OK


if __name__ == '__main__':
    print ''
    #dbSelectBelongMCard --- 测试
    #print dbSelectBelongMCard("24B5B806", "24B5B806")  -- ok
    #print dbSelectBelongMCard("24B5B806", "") -- ok
    #print dbSelectBelongMCard("", "24B5B806") -- ok
    #print dbSelectBelongMCard("", "")  -- ok

    #dbSelectDevUpdate --- 测试 -- ok
    #dbSelectDevUpdate("", "", "") #-- ok
    #dbSelectDevUpdate("24B5B806", "", 1.0) #-- ok
    #dbSelectDevUpdate("24B5B806", "", "") -- ok
    #dbSelectDevUpdate("24B5B806", "123455", "1.0")

    #dbSelectDevInfo --- 测试
    #print dbSelectDevInfo("123")
    #print dbSelectDevInfo("5730303148FF6B067266545327200667")

    #dbSelectStop -- 测试
    # dbSelectStop("24B5B806", "5730303148FF6B067266545327200667", "1.0")
    #dbSelectStop("24B5B806", "", '1.00')
    #dbSelectStop("", "", '1.00')

    #dbSelectstart -- 测试
    #dbSelectStart("", "", '1.00')
    #dbSelectStart("24B5B806", "5730303148FF6B067266545327200667", "1.0")



